package fiado.dao.memory;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import fiado.bean.Conta;
import fiado.bean.ItemConta;
import fiado.exception.DaoException;


public class ItemContaDAO {

	public static final List<ItemConta> tabela = Collections.synchronizedList(new ArrayList<ItemConta>());
	
	static {
		try {
			ItemConta ic = criarItemConta(7, 1, 1, 2, 5.0);
			ItemContaDAO.tabela.add(ic);
			ic = criarItemConta(7, 1, 2, 2, 3.0);
			ItemContaDAO.tabela.add(ic);
			
			ic = criarItemConta(7, 2, 2, 2, 3.0);
			ItemContaDAO.tabela.add(ic);
			
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	
	private static ItemConta criarItemConta(
			int idPessoa, 
			int numConta,
			int idProduto,
			int quantidade,
			double valor) throws ParseException {
		
		ItemConta ic = new ItemConta();
		
		ic.setIdPessoa(idPessoa);
		ic.setNumConta(numConta);
		//ic.setIdProduto(idProduto);
		ic.setQuantidade(quantidade);
		ic.setValor(valor);

		return ic;
	}
	
	
	private static List<ItemConta> copy(List<ItemConta> lista) {
		List<ItemConta> listaCopia = new ArrayList<ItemConta>();
		for (ItemConta ic : lista) {
			listaCopia.add(copy(ic));
		}
		return listaCopia;
	}
	
	private static ItemConta copy(ItemConta ic) {
		ItemConta copy = new ItemConta();
		copy.setIdPessoa(ic.getIdPessoa());
		copy.setNumConta(ic.getNumConta());
		//copy.setIdProduto(ic.getIdProduto());
		copy.setQuantidade(ic.getQuantidade());
		copy.setValor(ic.getValor());
		return copy;
	}
	
	/**
	 * Este metodo retorna uma lista com todos os objetos ItemConta armazenados
	 * @return
	 * @throws DaoException 
	 */
	public List<ItemConta> buscarTodos() throws DaoException {
		return copy(ItemContaDAO.tabela);
	}

	/**
	 * Este metodo retorna o objeto ItemConta de acordo com os campos chaves
	 * @return
	 * @throws DaoException 
	 */
	public ItemConta buscarPorId(ItemConta itemConta) throws DaoException {
		return null;//buscarPorId(itemConta.getIdPessoa(), itemConta.getNumConta(), itemConta.getIdProduto());
	}
	
	public ItemConta buscarPorId(int idPessoa, int numConta, int idProduto) throws DaoException {
		for (ItemConta ic : ItemContaDAO.tabela) {
			if (isIdItemConta(idPessoa, numConta, idProduto, ic)) {
				return copy(ic);
			}
		}
		return null;
	}
	
	/**
	 * Este metodo apaga o objeto ItemConta de acordo com os campos chave
	 * @throws DaoException 
	 */
	public void apagar(int idPessoa, int numConta, int idProduto) throws DaoException {
		Iterator<ItemConta> it = ItemContaDAO.tabela.iterator();
		while (it.hasNext()) {
			ItemConta ic = it.next();
			if (isIdItemConta(idPessoa, numConta, idProduto, ic)) {
				it.remove();
			}
		}
	}

	private boolean isIdItemConta(
			int idPessoa, 
			int numConta,
			int idProduto, 
			ItemConta ic) {
		return true;//ic.getIdPessoa() == idPessoa && ic.getNumConta() == numConta && ic.getIdProduto() == idProduto;
	}	
	
	/**
	 * Este metodo apaga o objeto ItemConta
	 * @throws DaoException 
	 */
	public void apagar(ItemConta itemConta) throws DaoException {
		Iterator<ItemConta> it = ItemContaDAO.tabela.iterator();
		while (it.hasNext()) {
			ItemConta ic = it.next();
			if (ic.equals(itemConta)) {
				it.remove();
			}
		}
	}
	
	/**
	 * Este metodo salva o objeto ItemConta 
	 * @throws DaoException 
	 */
	public void salvar(ItemConta itemConta) throws DaoException {
		Iterator<ItemConta> it = ItemContaDAO.tabela.iterator();
		while (it.hasNext()) {
			ItemConta ic = it.next();
			if (ic.equals(itemConta)) {
				it.remove();
			}
		}
		ItemContaDAO.tabela.add(copy(itemConta));
	}

	/**
	 * Este metodo cria o objeto ItemConta e retorna o objeto criado com o novo numConta
	 * preenchido
	 * @throws DaoException 
	 */
	public void criar(ItemConta itemConta) throws DaoException {
		ContaDAO contaDAO = new ContaDAO();
		ProdutoDAO produtoDAO = new ProdutoDAO();
		if (contaDAO.buscarPorId(itemConta.getIdPessoa(), itemConta.getNumConta()) == null) {
			throw new IllegalArgumentException("fk tabela TB_CONTA violada");
		}
//		if (produtoDAO.buscarPorId(itemConta.getIdProduto()) == null) {
//			throw new IllegalArgumentException("fk tabela TB_PRODUTO violada");
//		}
		ItemContaDAO.tabela.add(copy(itemConta));
	}

	public List<ItemConta> buscarPorConta(Conta conta) throws DaoException {
		List<ItemConta> lista = new ArrayList<ItemConta>();
		for (ItemConta ic : ItemContaDAO.tabela) {
			if (ic.getIdPessoa() == conta.getIdPessoa() && ic.getNumConta() == conta.getNumConta()) {
				lista.add(copy(ic));
			}
		}
		return lista;
	}
}
